/**
 * @创建时间 2011-09-07
 * @创建人 李志勇
 * @类作用 创建各种日志
 */
#ifndef _BASE_LOGDATAMANAGER_H
#define _BASE_LOGDATAMANAGER_H

#include "Common.h"
#include "Resource.h"
#include "Singleton.h"
#include "String.h"
#include "GameDataEnum.h"
#include "GameStruct.h"
#include "GameDefine.h"

typedef struct center_battle_tag_ CenterBattle;
class UserPtr;
class CharPtr;
class Mission;
struct game_logs_tag_;
typedef struct game_logs_tag_ GameLog;

#ifdef _USE_DEFAULT_LOG_DATA_MGR_
	class LogDataManager : public Singleton<LogDataManager>
#else
	class LogDataManager
#endif
{
public:
	LogDataManager();
	virtual ~LogDataManager();
	/**
	 * @创建时间 2011-09-13
	 * @创建人 李志勇
	 * @函数作用 登录日志
	 * @参数
	 *  @pUser 登录的用户
	 *  @serverType 登录服务器类型
	 */
	virtual void LoginLog(UserPtr pUser, const uint8 serverType);
	/**
	 * @创建时间 2011-09-13
	 * @创建人 李志勇
	 * @函数作用 退出日志
	 * @参数
	 *  @pChr 退出的角色
	 *  @serverType 当前退出的服务器类型
	 */
	virtual void LogoutLog(CharPtr pChr, const uint8 serverType);
	/**
	 * @创建时间 2011-09-13
	 * @创建人 李志勇
	 * @函数作用 经验增加日志
	 * @参数
	 *  @pChr 角色
	 *  @sourceType 来源类型
	 *  @addExp 增加多少
	 *  @fromId 从哪里获得（0：在交易时，表示商城）
	 */
	virtual void AddExpLog(CharPtr pChr, const SourceType sourceType, const uint32 addExp, const uint32 fromId = 0);
	/**
	 * @创建时间 2011-09-14
	 * @创建人 李志勇
	 * @函数作用 牌桌相关日志
	 * @参数
	 *  @pChr 角色
	 *  @channelId 牌桌ID
	 *  @subType 牌桌相关类型
	 *  @data1 产生的数值1
	 *  @data2 产生的数值2
	 */
	virtual void AboutTableLog(CharPtr pChr, const uint32 channelId, const TableLogType subType, const int32 & data1 = 0, const int32 & data2 = 0, const uint32 & data3 = 0, const uint32 & data4 = 0);
	/**
	 * @创建时间 2011-10-20
	 * @创建人 李志勇
	 * @函数作用 更新物品信息日志
	 * @参数
	 *  @pChr 角色
	 *  @SourceType 来源类型
	 *  @selfModelId 被更新的物品的模式ID
	 *  @Operate 更新物品操作（1：增，2：减，3：删）
	 *  @number 操作数量
	 *  @fromId 从哪里获得（0：在交易时，表示商城）
	 */
	virtual void UpdateItemsInfoLog(CharPtr pChr, const SourceType & sourceType, const uint32 & selfModelId, const UpdateItemNumberType & operate, const uint32 & number = 0, const uint32 & fromId = 0, const uint32 & data7 = 0, const uint32 & data8 = 0, String strGatewayAddHead = "");
	
	/**
	 * @创建时间 2011-10-20
	 * @创建人 李志勇
	 * @函数作用 根据打牌结果更新物品信息日志
	 * @参数
	 *  @pChr 角色
	 *  @selfModelId 被更新的物品的模式ID
	 *  @Operate 更新物品操作（1：增，2：减，3：删）
	 *  @number 操作数量
	 *  @roomId 房间ID
	 *  @channelId 牌桌ID
	 */
	virtual void UpdateItemsByGameResultLog(CharPtr pChr, const uint32 selfModelId, const UpdateItemNumberType operate, const uint32 number, const uint32 roomId, const uint32 channelId);
	
	// 添加机器人游戏结果日志
	virtual void UpdateRobotItemsInfoLog(CharPtr pChr, const SourceType & sourceType, const uint32 selfModelId, const UpdateItemNumberType operate, const uint32 number, const uint32 roomId, const uint32 channelId);
	
	/**
	 * @创建时间 2011-12-06
	 * @创建人 李志勇
	 * @函数作用 充值购买物品日志
	 * @参数
	 *  @pChr 角色
	 *  @selfModelId 物品模式ID
	 *  @number 数量
	 */
	virtual void UpdateItemsByUserBuyLog(CharPtr pChr, const uint32 selfModelId, const uint32 number);
	/**
	 * @创建时间 2011-10-20
	 * @创建人 李志勇
	 * @函数作用 元宝更新日志
	 * @参数
	 *  @pChr 角色
	 *  @sourceType 来源类型
	 *  @Operate 更新操作（1：增，2：减，3：删）
	 *  @number 操作数量
	 *  @fromId 从哪里获得（0：在交易时，表示商城）
	 */
	virtual void UpdateGoldsLog(CharPtr pChr, const SourceType sourceType, const UpdateItemNumberType operate, const uint32 number, const uint32 fromId = 0);
	/**
	 * @创建时间 2011-12-06
	 * @创建人 李志勇
	 * @函数作用 通过网关更新元宝日志
	 * @参数
	 *  @pUser 用户
	 *  @Operate 更新操作（1：增，2：减，3：删）
	 *  @number 操作数量
	 */
	virtual void UpdateGoldsFromGatewayLog(UserPtr pUser, const UpdateItemNumberType operate, const uint32 number);
	/**
	 * @创建时间 2011-11-04
	 * @创建人 李志勇
	 * @函数作用 改变人物形象
	 * @参数
	 *  @pChr 角色
	 *  @sourceType 来源类型
	 *  @figuralId 形象图标ID
	 *  @fromId 从哪里获得（0：在交易时，表示商城）
	 */
	virtual void ChangeFiguralLog(CharPtr pChr, const SourceType sourceType, const uint32 figuralId, const uint32 fromId = 0);
	/**
	 * @创建时间 2011-11-12
	 * @创建人 李志勇
	 * @函数作用 记录系统抽水
	 * @参数
	 *  @townId 房间ID
	 *  @channelId 牌桌ID
	 *  @ante 底分
	 *  @multy 倍数
	 *  @taxation 抽水数量
	 */
	virtual void SystemTaxationLog(const uint32 townId, const uint32 channelId, const uint32 ante, const uint32 multy, const uint32 taxation);
	/**
	 * @创建时间 2011-11-12
	 * @创建人 李志勇
	 * @函数作用 记录任务接收及完成
	 * @参数
	 *  @pChr 角色
	 *  @mission 任务对象
	 */
	virtual void MissionsLog(CharPtr pChr, const uint32 & channelId, const uint32 & model_id, const uint8 & status, const uint8 & again = 0, const uint32 & bount_model = 0, const uint32 & num = 0);
	/**
	 * @创建时间 2011-12-16
	 * @创建人 李志勇
	 * @函数作用 记录兑换实物日志
	 * @参数
	 *  @userId 用户ID
	 *  @goodsId 商品ID
	 *  @name 商品名称
	 *  @number 兑换数量
	 *  @cost 花费彩券
	 *  @billId 订单
	 */
	virtual void ChangePracticalityLog(const uint32 userId, const uint32 goodsId, const String &name, const uint32 number, const uint32 cost, const char *billId);
	/**
	 * @创建时间 2012-02-27
	 * @创建人 李志勇
	 * @函数作用 记录通过网关购买物品结果日志
	 * @参数
	 *  @pChr 角色
	 *  @goodsDesc 购买商品成分描述
	 *  @cost 支付总额
	 */
	virtual void GatwayBuyResultLog(CharPtr pChr, String &goodsDesc, const uint32 cost);
	/**
	 * @创建时间 2012-04-06
	 * @创建人 StarX
	 * @函数作用 小游戏日志
	 * @参数
	 *  @pChr 角色
	 *  @result 游戏结果
	 */
	 virtual void SMGameLog(CharPtr pChr, const SMGameData & smdata, const uint8 & result);
	 /**
	 * @创建时间 2012-12-11
	 * @创建人 StarX
	 * @函数作用 小游戏日志
	 * @参数
	 *  @pChr 角色
	 *  @gameid gameid
	 *  @result 游戏结果
	 *  @num 数量
	 */
	 virtual void SMGameLog(CharPtr pChr, 
				const uint32 & gameid, 
				const uint8 & result, 
				const uint32 & model_id, 
				const uint32 & num, 
				const uint32 & data4,
				const uint32 & data5);
	 /**
	 * @创建时间 2012-04-06
	 * @创建人 StarX
	 * @函数作用 猜拳游戏
	 * @参数
	 *  @pChr 角色
	 *  @result 游戏结果
	 */
	 virtual void SMGameMorraLog(const uint32 &serial1, const uint32 &serial2, const uint32 & val1, const uint32 & val2, const uint32 & ante, const uint32 & winner);
	
	/**
	 * @创建时间 2012-07-20
	 * @创建人 Roach
	 * @函数作用 推推乐战场结束数据记录
	 *	@pChr 角色Ptr
	 * 	@	  战场数据结构
	 */
	 virtual void TTLChannelLog(CharPtr pChr,
						const uint32 & channelId,	/* 战场ID */
						const uint32 & dest_type,	/* 战场类型 */
						const uint32 & data1 = 0,		/* 投放的金币 */		
						const uint32 & data2 = 0,		/* 1分金币 */
						const uint32 & data3 = 0,		/* 5分金币 */
						const uint32 & data4 = 0,		/* 珠宝 */
						const uint32 & data5 = 0,		/* 元宝 */
						const uint32 & data6 = 0,		/* 仙桃 */
						const uint32 & data7 = 0,		/* 小笼包 */
						const uint32 & data8 = 0,		/* 烤乳猪 */
						const uint32 & data9 = 0,		/* 木质宝箱 */
						const uint32 & data10 = 0,		/* 金宝箱 */
						const uint32 & data11 = 0,		/* 珍珠宝箱 */
						const uint32 & data12 = 0);		/* 使用时间 */
	
	/**
	 * @创建时间 2012-07-20
	 * @创建人 Roach
	 * @函数作用 推推乐战场金钱数据记录
	 *	@pChr 角色Ptr
	 * 	@	  战场数据结构
	 */
	  virtual void TTLChannelGoldsLog(CharPtr pChr,
						const uint32 & channelId,	/* 战场ID */
						const uint32 & dest_type,	/* 战场类型 */
						const uint32 & data1 = 0,		/* 投放的免费金币 */		
						const uint32 & data2 = 0,		/* 投放的付费金币 */
						const uint32 & data3 = 0,		/* 获得的红包数量 */
						const uint32 & data12 = 0);		/* 战场消耗时间 */
	
	
	/**
	 * @创建时间 2012-08-01
	 * @创建人 Roach
	 * @函数作用 游戏中黑协议日志记录
	 *	@pChr 角色Ptr
	 * 	@protocol_id	协议ID
	 */
	virtual void ErrorProtocolsLog(CharPtr pChr,const uint32 & protocol_id);
	/**
	 * @创建时间 2012-12-11
	 * @创建人 StarX
	 * @函数作用 抽水日志
	 *	@pChr 角色Ptr	src_id
	 * 	@fromId	来源	sub_type
	 * 	@num	数量	data1
	 *  @data2  附加1	data2
	 *  @data3  附加2	data3
	 */
	virtual void AddGamePumpLog(CharPtr pChr,const uint32 & fromId, const uint32 & num, const uint32 & data2 = 0, const uint32 & data3 = 0);
	/**
	 * @创建时间 2013-11-25
	 * @创建人 Roach
	 * @函数作用 乐码日志
	 * @参数
	 *  @pid 用户游戏ID
	 *  @mode 操作模式( 1 创建 2 验证 3 使用 4 过期）
	 *  @exchange_id 乐码ID
	 *  @data1  附加数据1
	 */
	 // virtual void LeMaOpLog(const uint32 & pid,const uint8 & mode,const uint32 & exchange_id,const uint32 & data1 = 0);
	 
	/**
	 * @创建时间 2013-12-05
	 * @创建人 Roach
	 * @函数作用 水果机积分日志
	 * @参数
	 *  @pChr 角色
	 *  @bounty_id 中奖ID
	 *  @multy 倍数
	 *  @get_score  获得的积分
	 *  @click_count  押注数量
	 */
	 virtual void FruitScoreUpdateLog(const uint32 & pid,const uint8 & mode,
												const uint8 & bounty_id = 0,
												const uint8 & multy = 0,
												const uint32 & get_score = 0,
												const uint32 & click_count = 0);
	 
	 //水果机积分得失详细日志
	virtual  void FruitScoreUseGetLog(CharPtr pChr,const uint32 & bounty_id,const uint32 & big,const uint32 & mult,const uint32 & use_coins,int get_coins);
	 
	// 获得日志产生原因
	virtual String GetLogCause(const uint32 &source);
	// 错误日志
	virtual void ErrorProtocolsLog(const uint32 &src_id, const uint32 &dest_id, const uint32 &error, const String & info = "");
	
	//========================棋牌圈相关日志===========================
	
	/**	
		@函数作用		组局完成记录
		@参数
			@owner_pid 	房主PID
			@cb_id 		组局ID
			@game_id	游戏ID
			@gz_id		游戏分区ID
			@model_id	开局费模式ID
			@num		开局费数量
			@status 	状态
	**/
	virtual void CreateCenterBattleLog(const uint32 & owner_pid, 
										const uint32 & cb_id, 
										const uint32 & game_id, 
										const uint32 & gz_id, 
										const uint32 & model_id, 
										const uint32 & num,
										const uint32 & status,
										const uint32 & loop,
										const uint32 & isPlayAll,
										const uint32 & mode);
	
	/**
		@函数作用		记录玩家组局一场总输赢
		@参数
			@cb_id		组局ID
			@game_id	游戏ID
			@gz_id		分区ID
			@loop		游戏局数
			@winLose	最终输赢
	**/
	virtual void CenterBattleResultLog(CharPtr pChr,
										CenterBattle cb,
										const uint32 & loop,
										const int32 & winLose,
										const uint8 & finish_status,
										bool bRoomOwner);
	
	// 游戏库存修改日志
	virtual void TownKunCunChangeLog(const uint32 & town_id, const int32 & change_num, const uint32 & curr_num, const uint8 & sub_type = en_ST_BRZJHTownKuCunChange);
	// 系统庄输赢日志
	virtual void SystemBankerWinLoseLog(const uint32 & town_id, const int32 & change_num, const uint32 & curr_num, const uint8 & sub_type = en_ST_BRZJHSystemBankerWinLose);
	
public:
	// 追加USER信息
	bool AppendUserLog(GameLog *pLog, UserPtr pUser);
	bool AppendUserLog(GameLog *pLog, CharPtr pChr);
	bool AppendUserLog(GameLog *pLog, const uint32 &user_id);
	
	String GetItemName(const uint32 & model_id);
	
	/**
	 * @创建时间 2011-10-10
	 * @创建人 李志勇
	 * @函数作用 将字符串转换成UTF8编码字符串
	 * @参数
	 *  @str 源字符串
	 */
	String GetUTF8String(String &str);
};



#endif // LOGDATAMANAGER_H
